package cn.itsub.proxy.common.protocol;

import lombok.var;

import java.util.Arrays;

/**
 * 代理客户端与代理服务器消息交换协议
 */
public class ProxyMessage {

    public enum TYPE{
        UNDEFINED   (0),
        AUTH        (1),
        LINK        (2),
        UNLINK      (4),
        RELAY       (5),
        HEARTBEAT   (7),
        HEART_ACK   (8),
        ;
        public byte value;

        TYPE(int value) {
            this.value=(byte) value;
        }

        public TYPE byValue(int value) {
            for (var handleEnum : values()) {
                if (handleEnum.value==value) {
                    return handleEnum;
                }
            }
            throw new RuntimeException("enum value undefined.");
        }

    }

    /** 客户端认证，检测clientKey是否正确 */
    public static final byte TYPE_AUTH = 0x01;

    // /** 保活确认消息 */
    public static final byte TYPE_ACK = 0x02;

    /** 代理后端服务器建立连接消息 */
    public static final byte TYPE_LINK = 0x03;

    /** 代理后端服务器断开连接消息 */
    public static final byte TYPE_UNLINK = 0x04;

    /** 数据转发 */
    public static final byte TYPE_RELAY = 0x05;

    /** 用户与代理服务器以及代理客户端与真实服务器连接是否可写状态同步 */
    public static final byte TYPE_WRITE_CONTROL = 0x06;

    /** 心跳消息 */
    public static final byte TYPE_HEARTBEAT = 0x07;


    /** 消息类型 */
    private TYPE type;

    /** 消息命令请求信息 */
    private String content;

    /** 消息传输数据 */
    private byte[] data;

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public byte[] getData() {
        return data;
    }

    public void setData(byte[] data) {
        this.data = data;
    }

    public TYPE getType() {
        return type;
    }

    public void setType(TYPE type) {
        this.type = type;
    }

    @Override
    public String toString() {
        if (data!=null&&data.length > 50) {
            return String.format("ProxyMessage [type[%s], content[%s], data(%s)[...]", type,content,data.length);
        }
        return String.format("ProxyMessage [type[%s], content[%s], data(%s)%s", type,content,data==null?0:data.length,Arrays.toString(data));
    }

}
